package cn.swunet.schat.service;

import java.util.Vector;

import cn.swunet.bean.User;
import cn.swunet.dao.UserDao;

/**
 * 管理在线用户，维持ip port记录
 * 
 * @author: arosen.swunet@qq.com
 *
 * @date: 2020年5月2日
 *
 */
public class UserManagerWorker implements Runnable{

	private static Vector<User> onlineUser;
	private static Vector<Integer> freshUserIdList;
	private static UserDao userDao = new UserDao();
	
	@Override
	public void run() {
		onlineUser = new Vector<User>();
		freshUserIdList = new Vector<Integer>();
		
		while (true) {
			
			//所有时间加一遍
			for (User user: onlineUser) {
				user.setLastActive(user.getLastActive()+1);
			}
			
			//有心跳包
			if (!freshUserIdList.isEmpty()) {
				for (int i = 0; i < freshUserIdList.size(); i++) {
					for (int j = 0; j < onlineUser.size(); j++) {
						if (freshUserIdList.elementAt(i) == onlineUser.elementAt(j).getId()) {
							//上次活动清零
							onlineUser.elementAt(j).setLastActive(0);
							//清除已经发送心跳包的记录
							freshUserIdList.remove(i);
							break;
						}
					}
				}
			}
			
			//删除已经超时的记录 3*5 s
			for (int j = 0; j < onlineUser.size(); j++) {
				if (onlineUser.elementAt(j).getLastActive() > 3) {
					userDao.clearUserHostById(onlineUser.elementAt(j).getId());
					onlineUser.remove(j);
				}
			}
			
			//线程检查一次休息5s
			try {
				Thread.currentThread().sleep(5_000);
			} catch (InterruptedException e) {
				System.out.println("UserManager: an error occurred!");
			}
		}
	}
	
	/**
	 * 当有用户上线时，调用该方法添加到在线列表，并同步数据库
	 * @author:arosen.swunet@qq.com
	 * @return:void
	 */
	public static synchronized  void addOnlineUser(User user) {
		//数据库同步
		userDao.setUserHostById(user.getId(), user.getActiveIp(), user.getActivePort());
		onlineUser.add(user);
	}
	
	/**
	 * 当收到心跳包后，取出uid，并添加到待刷新列表
	 * @author:arosen.swunet@qq.com
	 * @return:void
	 */
	public static synchronized void addFreshUser(int u_id) {
		if (u_id < 0 || u_id % 100_000_000 > 0)
			return;
		
		freshUserIdList.add(u_id);
	}
	
	/**
	 * 从在线的好友列表里面查找是否有指定id的用户存在
	 * 		存在即返回
	 * 		不存在返回null;
	 * @author:arosen.swunet@qq.com
	 * @return:User
	 */
	public static synchronized User getOnlineUser(int u_id) {
		User user = null;
		for (User u : onlineUser) {
			if(u.getId() == u_id) {
				user = u;
			}
		}
		
		return user;
	}
}
